package com.sprouting.ops.service;


import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sprouting.ops.dao.DromaraFileStorageDao;
import com.sprouting.ops.dao.OpsComponentVersionDao;
import com.sprouting.ops.interfaces.ConstantBase;
import com.sprouting.ops.model.DromaraFileStorage;
import com.sprouting.ops.model.OpsComponentVersion;
import com.sprouting.ops.model.qo.OpsComponentVersionQo;
import com.sprouting.ops.model.vo.OpsComponentVersionVo;
import org.dromara.x.file.storage.core.FileStorageService;
import org.springframework.stereotype.Service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * (组件版本信息表)表服务实现类
 *
 * @author longx
 * @since 2023-11-25 18:39:34
 */
@Service
@Slf4j
public class OpsComponentVersionService extends ServiceImpl<OpsComponentVersionDao, OpsComponentVersion> {

    @Resource
    private OpsComponentVersionDao opsComponentVersionDao;
    @Resource
    private DromaraFileStorageDao dromaraFileStorageDao;



    /**
     * 根据版本查询组件的版本信息,会过滤掉指定的id
     * @param componentId 组件id
     * @param version 版本
     * @param id 主键，会忽略
     * @return
     */
    public OpsComponentVersion getByVersionFilterId(String componentId, String version, String id) {
        return opsComponentVersionDao.getByVersionFilterId(componentId, version, id);
    }

    /**
     * 分页查询 组件版本信息
     * @param page 分页参数
     * @param query 查询参数
     * @return
     */
    public Page<OpsComponentVersionVo> getOpsComponentVersionPageList(Page page, OpsComponentVersionQo query) {
        return opsComponentVersionDao.getOpsComponentVersionPageList(page, query);
    }

    // /**
    //  * 根据ID查询可以依赖的组件
    //  * @param appIdList 应用ID
    //  * @return
    //  */
    // public List<OpsComponentVersionVo> getByAppIdBatch(List<String> appIdList) {
    //     return opsComponentVersionDao.getByAppIdBatch(appIdList);
    // }

    /**
     * 根据类型查询组件版本
     * @param componentId 组件ID
     * @param type 组件类型
     * @param id 过滤掉的id
     * @return
     */
    public List<OpsComponentVersion> getByTypeFilterId(String componentId, Integer type, String id) {
        return opsComponentVersionDao.getByTypeFilterId(componentId, type, id);
    }

    /**
     * 保存组件版本
     * @param opsComponentVersion 组件版本
     * @param oldMainVersion 旧的组件版本
     * @param list Markdown的图片信息
     */
    @Transactional(rollbackFor = Exception.class)
    public void saveOpsComponentVersion(OpsComponentVersion opsComponentVersion, OpsComponentVersion oldMainVersion, List<DromaraFileStorage> list) {
        opsComponentVersionDao.insert(opsComponentVersion);

        if (oldMainVersion != null){
            // 一个主版本只有一个
            opsComponentVersionDao.updateById(oldMainVersion);
        }

        if (CollUtil.isNotEmpty(list)){
            for (DromaraFileStorage dromaraFileStorage : list) {
                dromaraFileStorageDao.updateById(dromaraFileStorage);
            }
        }
    }

    /**
     * 更新组件版本
     * @param opsComponentVersion 组件版本
     * @param oldMainVersion 旧的组件版本
     * @param list Markdown的图片信息
     */
    @Transactional(rollbackFor = Exception.class)
    public void updOpsComponentVersion(OpsComponentVersion opsComponentVersion, OpsComponentVersion oldMainVersion, List<DromaraFileStorage> list) {
        opsComponentVersionDao.updateById(opsComponentVersion);

        if (oldMainVersion != null){
            // 一个主版本只有一个
            opsComponentVersionDao.updateById(oldMainVersion);
        }

        if (CollUtil.isNotEmpty(list)){
            for (DromaraFileStorage dromaraFileStorage : list) {
                dromaraFileStorageDao.updateById(dromaraFileStorage);
            }
        }
    }

    /**
     * 删除一个版本
     * @param opsComponentVersion 版本
     * @param list 图片信息
     */
    public void delOpsComponentVersion(OpsComponentVersion opsComponentVersion, List<DromaraFileStorage> list) {
        opsComponentVersionDao.deleteById(opsComponentVersion);

        if (CollUtil.isNotEmpty(list)){
            for (DromaraFileStorage dromaraFileStorage : list) {
                dromaraFileStorage.setTempFile(ConstantBase.TempFile.PRODUCTION_DEL);
                dromaraFileStorage.setDelTime(new Date());
                dromaraFileStorageDao.updateById(dromaraFileStorage);
            }
        }
    }
}

